package main

import "fmt"

type stu struct {
	Age  int
	Name string
}

func (s stu) getAge() int {
	return s.Age
}

func (s *stu) setAge(age int) {
	s.Age = age
}

func main() {
	/*
		通过结构体类型字面量显式地进行 值调用 和 表达式调用，可以看到在这种情况下编译器不会做自动转换，会进行严格的方法集检查。

		（1）若类型 S 包含匿名字段 T，则 S 的方法集包含 T 的方法集
		（2）若类型 S 包含匿名字段 *T，则 S 的方法集包含 T 和 *T 方法集
		（3）不管类型 S 中嵌入的匿名字段是 T 还是 *T，*S 的方法集总是包含 T 和 *T 方法集
	*/
	s := stu{Age: 18, Name: "lyc"}
	stu.getAge(s)
	//stu.setAge(s, 20) //cannot call pointer method setAge on stu
	(*stu).setAge(&s, 20)
	(*stu).getAge(&s)
	fmt.Println(s)
	/*
		{20 lyc}
	*/
}
